package br.com.tiespec.web.ManagedBean;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.ejb.EJB;
import javax.enterprise.context.SessionScoped;
import javax.inject.Named;

import org.primefaces.model.LazyDataModel;
import org.primefaces.model.SortOrder;

import br.com.tiespec.ejb.EjbInterface.ProjetoInterface;
import br.com.tiespec.model.Enum.TipoSortOrder;
import br.com.tiespec.model.Modelo.ClienteProjeto;
import br.com.tiespec.model.Modelo.Projeto;
import br.com.tiespec.model.Util.RNException;
import br.com.tiespec.web.Util.InitUtil;
import br.com.tiespec.web.Util.WebUtil;

@Named("projetoBean")
@SessionScoped
public class ProjetoBean implements Serializable {

	private static final long serialVersionUID = 2861011385022688997L;

	@EJB private ProjetoInterface ejb;
	
	private Projeto projetoInstance;
	private Projeto projetoInstanceTemp;
	private LazyDataModel<Projeto> projetoList;
	
	private Long idClientePortal;
	
	private String varBuscaProjeto;
	private String varBuscaCodigo;
	private String varBuscaCliente;
	
	private LazyDataModel<ClienteProjeto> clienteProjetoList;
	
	@PostConstruct
	public void init(){
		projetoInstance = new Projeto();
		projetoInstanceTemp = new Projeto();
		varBuscaProjeto = null;
		projetoList = InitUtil.inicializaProjetoList();
		clienteProjetoList = InitUtil.inicializaClienteProjetoList();
	}
	
	public String projeto(){
		init();
		return "/views/projeto/show.xhtml";
	}
	
	public String goCreate(){
		projetoInstance = new Projeto();
		return "/views/projeto/create.xhtml";
	}
	
	public String goEdit(){
		return "/views/projeto/edit.xhtml";
	}
	
	public String salvarProjeto(){
		try {
			ejb.salvarProjeto(projetoInstance);
			return "/views/projeto/show.xhtml";
		} catch (RNException e){
			return null;
		}
	}
	
	public String atualizarProjeto(){
		try {
			ejb.atualizarProjeto(projetoInstance);
			return "/views/projeto/show.xhtml";
		} catch (RNException e){
			return null;
		}
	}
	
	public void removerProjeto(){
		try {
			ejb.removerProjeto(projetoInstance);
		} catch (RNException e){
			
		}
	}
	
	public String visualizarDescricoes(){
		//visualizar a lista de descricções do projeto? Ou já direcionar com o projeto selecionado?
		return "";
	}
	
	@SuppressWarnings("serial")
	public void filtrarProjeto(){
		projetoList = new LazyDataModel<Projeto>() {
			@Override
			public List<Projeto> load(int first, int pageSize, String sortField, SortOrder sortOrder, Map<String, String> filters) {
				WebUtil.setDataTableRows(pageSize);
				return ejb.listarProjetos(first, pageSize, sortField, 
					TipoSortOrder.convertePrimeFaces(sortOrder.toString()), idClientePortal, varBuscaCodigo, varBuscaProjeto, varBuscaCliente);
			}
			@Override  
	        public Projeto getRowData(String rowKey) {  
	        	try {
		            return ejb.selecionarProjeto(Long.parseLong(rowKey));
	        	} catch (NumberFormatException e){
	        		return new Projeto();
	        	}
	        }  
	        @Override  
	        public String getRowKey(Projeto objeto)  
	        {  
	        	if (objeto!=null)
	        		return ""+objeto.getId();
	        	return "";
	        }  
		};
		projetoList.setRowCount(ejb.countProjetos(idClientePortal,  varBuscaCodigo, varBuscaProjeto, varBuscaCliente));
		projetoList.setPageSize(5);
	}
	
	public void selecionarProjeto(){
		projetoInstance = projetoInstanceTemp;
		projetoInstanceTemp = new Projeto();
		varBuscaProjeto = "";
		projetoList = InitUtil.inicializaProjetoList();
	}
	
	public void cancelarSelecionarProjeto(){
		projetoInstanceTemp = new Projeto();
		varBuscaProjeto = "";
		projetoList = InitUtil.inicializaProjetoList();
	}
	
	public String goHome(){
		this.destroy();
		return "goHome";
	}
	
	@PreDestroy
	public void destroy(){
		projetoInstance = null;
		projetoInstanceTemp = null;
		varBuscaProjeto = null;
		projetoList = null;
	}

	public Projeto getProjetoInstance() {
		return projetoInstance;
	}

	public void setProjetoInstance(Projeto projetoInstance) {
		this.projetoInstance = projetoInstance;
	}

	public Projeto getProjetoInstanceTemp() {
		return projetoInstanceTemp;
	}

	public void setProjetoInstanceTemp(Projeto projetoInstanceTemp) {
		this.projetoInstanceTemp = projetoInstanceTemp;
	}

	public LazyDataModel<Projeto> getProjetoList() {
		return projetoList;
	}

	public void setProjetoList(LazyDataModel<Projeto> projetoList) {
		this.projetoList = projetoList;
	}

	public String getVarBuscaProjeto() {
		return varBuscaProjeto;
	}

	public void setVarBuscaProjeto(String varBuscaProjeto) {
		this.varBuscaProjeto = varBuscaProjeto;
	}
	
	public void setClienteProjetoList(
			LazyDataModel<ClienteProjeto> clienteProjetoList) {
		this.clienteProjetoList = clienteProjetoList;
	}
	
	public void setVarBuscaCliente(String varBuscaCliente) {
		this.varBuscaCliente = varBuscaCliente;
	}
	
	public String getVarBuscaCodigo() {
		return varBuscaCodigo;
	}
	
	public void setVarBuscaCodigo(String varBuscaCodigo) {
		this.varBuscaCodigo = varBuscaCodigo;
	}
	
	public LazyDataModel<ClienteProjeto> getClienteProjetoList() {
		return clienteProjetoList;
	}
	
}
